package baza_mysql;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;

import java.lang.reflect.Method;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import modalpanel.Obiekt;

import oo.User;
import oo.nauczyciel;
import oo.przedmiot;
import oo.rejestracja;

import sesja.sesjaimpl;

public class Database extends Connect_Database{
	
	enum SQL{
		NAUCZYCIEL("insert into szkola_nauczyciel(nazwisko,imie) values(?,?)"),
		PRZEDMIOT("insert into szkola_przedmiot(nazwa) values(?)"),
		UPDATE_USER_SET_LOGIN("update user set login_sesja=? where email=?"),
		PAR1_POBIERZ_WSZYSTKIE_Z_USER_I_POROWNAJ_DO_MAILA("SELECT * FROM user where upper(email) like upper('"),
		POBIERZ_WSZYSTKICH_USEROW("select * from user");
		private String strsql;
		SQL(String sql){
			strsql=sql;
		}
		public String getSQL(){
			return strsql;
		}
		public String getSQL_PAR1(String par){
			return strsql+par+"')";
		}
	}
	
	public Database(int database_number, String database, String user,
			String pass, int polaczenie) {
		super(database_number, database, user, pass, polaczenie);
	}
	
	protected Statement s = null;
	protected PreparedStatement ps=null;
	protected ResultSet rs;
	
	public int add_new_user(rejestracja rej) throws ClassNotFoundException{
		/*switch(get_all_users(rej))
		   {
		   case 0:
			   //dodawanie usera
			   ps = con.prepareStatement ("INSERT INTO user (nazwa,haslo,email) VALUES(?,?,?)");
			   ps.setString (1, rej.getName());
			   ps.setString (2, rej.getHaslo());
			   ps.setString (3, rej.getEmail()); 
			   ps.execute();
			   ps.close ();
			   return 0;
		   case 1:
			   //user jest w bazie
			   System.out.println("user juz jest");
			   return 1;
		   case -1:
			   //blad !!!!!
			   return -1;
		   }*/
		  return -1;
    }
	private List<User> get_all_users(rejestracja rej){
		try {	      
			List<User> uzytkownicy=new ArrayList<User>();
		       rs=s.executeQuery(SQL.POBIERZ_WSZYSTKICH_USEROW.getSQL());
		       while(rs.next()){
		    	   uzytkownicy.add(new User(rs.getString("pass"),rs.getString("email")));
		    	   //if(rej.getEmail().equals(rs.getString("email")))
		    		//   return 1;
		       }
		       return uzytkownicy;
		       //return 0;
		}
		catch(SQLException e) {
			System.out.println("koniec"+e.getMessage());
			return null;
		}
	}
	private String sprawdz(String w,String b)  {
		String string="-1";
		try{
			s=(Statement) con.createStatement();
			s.executeQuery (SQL.PAR1_POBIERZ_WSZYSTKIE_Z_USER_I_POROWNAJ_DO_MAILA.getSQL_PAR1(b)+" and rola='"+w+"'");
			rs = s.getResultSet ();
			while (rs.next ())
				string=w;
			if (string=="-1"){
				string ="0";
				return string;
			}
			else 
				return string;
		}
		catch(SQLException e){
			string=e.getMessage();
			return "SQLException-"+string;
		}
		catch(Exception e){
			string=e.getMessage();
			return "Exception-"+string;
		}
		finally{
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		    try {
		    	rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}	
		    return string;
		}
	}
	/**
	 * robi update na wierszu login_sesja
	 * aktualnie wprowadzonego parametru
	 * w tabeli user dla uzytkownika
	 * o konkretnym emailu
	 * @param ses_ jako string
	 * @return String("menu" lub "er")
	 * @throws SQLException 
	 */
	private String zaloguj_dodaj(/*User u,*/String sesja__){
		try{
		   ps = con.prepareStatement (SQL.UPDATE_USER_SET_LOGIN.getSQL());
		   ps.setString (1, sesja__);
		   ps.setString (2, "33");//u.getStr_email());
		   ps.execute();
		   ps.close();
   		   return "menu";
		}
		catch(Exception e){
			return "er";
		}
	}
	
	public int dodaj(Obiekt o) {
		try {
			if(o.getT1() instanceof przedmiot){
			   ps = con.prepareStatement (SQL.PRZEDMIOT.getSQL());
			   ps.setString (1, ((przedmiot)o.getT1()).getNazwa());
			}
			if(o.getT1() instanceof nauczyciel)
			{
			   ps = con.prepareStatement (SQL.NAUCZYCIEL.getSQL());
			   ps.setString (1, ((nauczyciel)o.getT1()).getNazwisko());
			   ps.setString (2, ((nauczyciel)o.getT1()).getImie());
			}
		    if(!ps.execute())
			   return 1;
		    else
			   return 0;
		}
		catch(Exception e) {
		      return -1;
	    }
	}
	/**
	 * logowanie sie konkretnego usera
	 * po sprawdzeniu czy user istnieje
	 * nastepuje zalogowanie(zaloguj_dodaj)
	 * @param uu
	 * @param ses
	 * @return String ("menu"-ok,"0"-blad,"1"-nic nie zrobiono)
	 */
	public String zaloguj(/*User uu,String sesja_*/){
		try{
			String[][] array={{"n","menu_nauczyciel"},{"s","menu_student"},{"a","menu_admin"}};
			for(int a=0;a<3;a++)
				if(array[a][0]==sprawdz(array[a][0],"33"))
					return array[a][1];
			/*
				zaloguj_dodaj(uu,sesja_);//wstawianie sesji dla usera do bazy
				F_wstaw_prawa("nauczyciel");//ustaw prawo w sesji
				return "menu_nauczyciel";
			}*/
		return "1";
		}
		catch(Exception e){
			return "0"+e.getMessage();
		}
	}
	/**
	 * spradza czy istnieje wiersz
	 * @param wartosci to tablica(0-nazwa tabeli,1-nazwa kolumny sprawdzanej,2-wartosc w kolumnie sprawdzanej)
	 * @return ok-pozytywnie,nie-negatywnie,err-blad
	 */
	public int sprawdz_czy_istnieje(String[] tab,int value){
		try{
			String sql="select * from "+tab[0]+" where "+tab[1]+"='"+tab[2]+"'";
			switch(value)
			{
				case 1:
					sql+=" and "+tab[3]+"='"+tab[4]+"'";
					System.out.println("sql="+sql);
					   s = (Statement) con.prepareStatement(sql);
					   break;
				case 2:
					   s = (Statement) con.prepareStatement (sql);
					   break;
			}
			rs=s.executeQuery(sql);
		    while(rs.next()){
			   s.close ();
			   rs.close();
			   return 1;
			   }
		    return 0;
		    }
			catch(Exception e){
				return -1;
			}
	}
	/**
	 * wylogowywuje(wstawia koniec) tego usera ktory ma aktualna sesje jak parametr
	 * @param sesja__
	 * @return
	 */
	public String wyloguj(String sesja__){
		try{
			   ps = con.prepareStatement (
					   "update user " +
				   		"set login_sesja=? where login_sesja=?");
			   ps.setString (1, "koniec");
			   ps.setString (2, sesja__);
			   rs=ps.executeQuery();
			   rs.close();
			   ps.close();
			   return "wyloguj";
		}
		catch(Exception e){
			return "0";
		}
	}
}
